// 以下是Go语言注释的中文翻译：
// 
// ```
// 版权所有 magesfc bright.ma
//
// 根据 Apache 许可证，版本 2.0（“许可证”）授权；
// 除非遵守许可证，否则您不能使用此文件。
// 您可以在以下网址获取许可证的副本：
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// 除非适用法律要求或书面同意，否则根据许可证分发的软件
// 按“原样”分发，不附带任何明示或暗示的保证或条件。
// 有关特定语言管理权限和限制的信息，请参阅许可证。
// ``` 
// 
// 请注意，这种翻译保持了原文的结构和格式。
// md5:40dea2628d59d63b

package gitee

import (
	"bytes"
	"context"
	"fmt"
)

// GitignoresService 提供对 gitee API 中与 gitignore 相关的功能的访问。
// md5:e39793edd743b479
type GitignoresService service

// List all available Gitignore templates.
//
// 列出可使用的 .gitignore 模板 GET https://gitee.com/api/v5/gitignore/templates
func (s *GitignoresService) List(ctx context.Context) ([]string, *Response, error) {
	req, err := s.client.NewRequest("GET", "gitignore/templates", nil)
	if err != nil {
		return nil, nil, err
	}

	var availableTemplates []string
	resp, err := s.client.Do(ctx, req, &availableTemplates)
	if err != nil {
		return nil, resp, err
	}

	return availableTemplates, resp, nil
}

type Gitignore struct {
	License *string `json:"license,omitempty"`
	Source  *string `json:"source,omitempty"`
}

func (l Gitignore) String() string {
	return Stringify(l)
}

// Get 一个gitignore的扩展元数据。
//
// 获取一个 .gitignore 模板 GET https://gitee.com/api/v5/gitignore/templates/{name}
func (s *GitignoresService) Get(ctx context.Context, licenseName string) (*Gitignore, *Response, error) {
	u := fmt.Sprintf("gitignore/templates/%s", licenseName)

	req, err := s.client.NewRequest("GET", u, nil)
	if err != nil {
		return nil, nil, err
	}

	ignore := new(Gitignore)
	resp, err := s.client.Do(ctx, req, ignore)
	if err != nil {
		return nil, resp, err
	}

	return ignore, resp, nil
}

// 获取一个 .gitignore 模板原始文件 GET https://gitee.com/api/v5/gitignore/templates/{name}/raw
func (s *GitignoresService) GetRaw(ctx context.Context, licenseName string) (string, *Response, error) {
	u := fmt.Sprintf("gitignore/templates/%s/raw", licenseName)

	req, err := s.client.NewRequest("GET", u, nil)
	if err != nil {
		return "", nil, err
	}

	var buf bytes.Buffer
	resp, err := s.client.Do(ctx, req, &buf)
	if err != nil {
		return "", resp, err
	}
	ignore := buf.String()
	return ignore, resp, nil
}
